import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
//将localstorage中的shopcart 读取取出来赋值给cart 如果有shopcart这个键值，就把这个值转换为普通数组，如果没有，就返回一个空数组
var cart = JSON.parse(localStorage.getItem('shopcart')||'[]')

//由于从本地存储中取出的值是一个字符串，所以还需要重新转换成布尔值，我这用的是三元运算符转换的
var status = localStorage.getItem('selectall')==='false'?false:true
export default new Vuex.Store({
  state: {
    shopcartdata:cart, //专门用来存放购物车中商品数据的数组，这个数据都是保存在内存中，每次刷新页面都会清空
    selectAll:status
  },
  mutations: {
    SET_SHOPCARTDATA(state,payload){//这是把商品信息添加到state中shopcartdata的方法
        //添加前要判断shopcartdata，有没有你要添加的商品，根据id判断，
        // 如果有这个商品，就把这次添加的商品数量加到原来的数量中去
        //如果没有id跟我这次添加的商品id一致，表示shopcartdata没有这个商品，所以就将全部数据push到shopcartdata这个数组中
      var ishas =  state.shopcartdata.some(item => {
            if (payload.id === item.id){ //将当前要添加的商品的id跟购物车数据中的所有对象比对一下，有一样的说明购物车中有这个商品，就加数量就行了
                item.count += payload.count
            return true
            }
        });
          if (!ishas) {
              state.shopcartdata.push(payload)//把这个商品直接push到商品的数组中
          }
          //每次加完购物车，我们将购物车中的数据，也就是shopcartdata数组，存在本地local storage中
        localStorage.setItem('shopcart',JSON.stringify(state.shopcartdata))

    },
    CHANGE_STATUS(state,id){//修改购物车商品的选择状态,1、遍历数组中的对象，找到与id相同的那个对象，把这个对象中的selected属性，取反
    //     var flag =  state.shopcartdata.some(item=>{// 使用some方法
    //         if(item.id===id){
    //             item.selected = !item.selected
    //     }
    //         //你要检查一下商品数组中的所有选中状态，如果有一个是false，就得让全选按钮变成false
    //     //相当：如果所有的商品都是true，全选才能是true
    //         if (!item.selected) {
    //             return true
    //         }
    //
    // });
       state.shopcartdata.forEach(item=>{
           if(item.id===id)
            item.selected = !item.selected
        }
    );
        //你要检查一下商品数组中的所有选中状态，如果有一个是false，就得让全选按钮变成false
        //相当：如果所有的商品都是true，全选才能是true
        var flag =  state.shopcartdata.every(item=>{
            return item.selected===true
    });
        console.log(flag);
        state.selectAll = flag
        localStorage.setItem('shopcart',JSON.stringify(state.shopcartdata)) //修改完结果要重新写入本地存储
    },
    INCREASE(state,id){ //修改state中对应商品的数量，不能少于1，也不能大于库存数量
        state.shopcartdata.some(item=>{
            if(id===item.id && item.count<item.stock){//查找对应的商品，id相同,并且当前数量小于库存数量，就让数量加一
                item.count ++
          }
        })
          localStorage.setItem('shopcart',JSON.stringify(state.shopcartdata)) //修改完结果要重新写入本地存储
   },
    DECREASE(state,id) {//修改state中对应商品的数量，不能少于1，也不能大于库存数量
       state.shopcartdata.some(item => {//查找对应的商品，id相同,并且当前数量大于1，就让数量减一
           if(id === item.id && item.count > 1){
           item.count--
       }
   })
       localStorage.setItem('shopcart', JSON.stringify(state.shopcartdata)) //修改完结果要重新写入本地存储
   },
    DELETE_GOODS(state,index){ //根据传递过来的索引，删除state.shopcartdata数组中指定的商品
        state.shopcartdata.splice(index,1);
        localStorage.setItem('shopcart',JSON.stringify(state.shopcartdata)) //修改完结果要重新写入本地存储
    },
    CHANGE_SELECTALL(state){//接收到结算组件全选按钮的点击，然后让state中selectAll的值取反，同时修改商品数组中所有商品选中状态，跟他一样
        state.selectAll = !state.selectAll;
        //遍历商品数组，让所有的选中属性值与全选按钮的值一致
        state.shopcartdata.forEach(item=>{
            item.selected = state.selectAll
        })
        localStorage.setItem('shopcart',JSON.stringify(state.shopcartdata)) //修改完结果要重新写入本地存储
        localStorage.setItem('selectall',JSON.stringify(state.selectAll))
    }
   },
  getters:{ //换一种方式或者是增加某种条件或格式，来输出state中的数据
      shopcartTotalCount(state){ //底部导航购物车徽标上的数量,要求是显示购物车中所有商品数量的总和
          var t = 0;
          state.shopcartdata.forEach(item=>{ //item表示商品数组中的每一个具体的商品对象，我们把所有的item.count
              //累加到 t上，最后输出这个t
              t += item.count
          });
          return t
      },
      accountTotal(state){//这是提供给account结算组件需要的数据
          // 1、数量合计：要求出所有selected为true的商品的数量和；2、金额合计：要求出所有selected为true的商品的金额合计
        var obj = {countTotal:0,priceTotal:0}
        state.shopcartdata.forEach(item=>{  //遍历购物车商品数组中的每个对象
            if(item.selected){//判断这个对象的selected属性是否为true，如果是，就把他的数量，和金额累加到obj对象中
               obj.countTotal += item.count;
               obj.priceTotal += item.count*item.price
          }
        })
          return obj  //把obj计算的结果赋值给 accountTotal，注意这个属性是个对象，调用时候要accountTotal.countTotal
      }
  },
  actions: {

  }
})
